package transaction_demo;

import transaction_demo.Util.DBUtil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * 4.有事务，被动失败(程序导致) -- 保持一致性
 * @author haomin
 * @date 2022/04/08 20:51
 **/
public class Demo4 {
    public static void main(String[] args) throws SQLException {
        String sql1 = "insert into records (rid,bid) values (2,2)";
        String sql2 = "update books set stock = stock - 1 where bid = 2";

        //同一个事务中，必须在一条 Connection 完成
        try(Connection c = DBUtil.connection()){
            c.setAutoCommit(false);

            try (PreparedStatement ps = c.prepareStatement(sql1)) {
                ps.executeUpdate();
            }

            // 执行完第一条 SQL 之后，要让第二条 SQL 执行失败
            // 由于我们代码中的异常导致的被动失败
            int a = 1 / 0;      // 一定会出现 除0异常，下面的代码不会再执行
            // 我们没有 catch 除0异常，导致异常交给 JVM 去处理
            // JVM 会终止程序执行
            // 第一条 SQL 成功、第二条 SQL 失败，没有 commit

            try (PreparedStatement ps = c.prepareStatement(sql2)) {
                ps.executeUpdate();
            }

            c.commit();
        }
    }
}